package task1;

import java.io.*;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/**
 * 学生管理系统类
 */
public class StudentManageSystem {
    // 定义学生集合
    private List<Student> students = new ArrayList<>();

    public void setStudents(List<Student> students) {
        this.students = students;
    }

    public List<Student> getStudents() {
        return students;
    }

    // 添加学生信息方法
    public void add(Student student){
        if (student.getId() != null && student.getAge() != 0){
            // 若当前学生信息系统内容为空，直接添加
            if (students.size() == 0){
                students.add(student);
                System.out.println("当前学生信息添加成功！");
            }
            // 否则遍历看是否重复添加,这里用迭代器迭代，普通遍历会出现并发错误
            else {
                ListIterator<Student> listIterator = students.listIterator();
                while (listIterator.hasNext()){
                    Student cur_student = listIterator.next();
                    if (cur_student.getId().equals(student.getId())){
                        System.out.println("系统中已存在该学生信息！");
                        break;
                    }
                }
                listIterator.add(student);
                System.out.println("当前学生信息添加成功！");
            }
        }
    }

    // 根据学号删除学生信息方法
    public void delete(String id){
        // 遍历全部学生，遇到学号一样的，对其进行删除，利用迭代器进行删除，否则会有并发错误
        ListIterator<Student> listIterator = students.listIterator();
        while (listIterator.hasNext()){
            Student cur_student = listIterator.next();
            if (cur_student.getId().equals(id)){
                listIterator.remove();
                System.out.println("学生信息删除成功！");
                break;
            }else
                System.out.println("输入学号有误！当前学生管理系统没有该学生信息！");
        }
    }

    // 根据学号修改学生信息方法
    public void modify(Student student){
        // 遍历全部学生，遇到学号一样的，对其信息进行修改
        for (Student st:students){
            if (st.getId().equals(student.getId())){
                st.setName(student.getName());
                st.setAge(student.getAge());
                System.out.println("已成功修改该学生信息！修改后的信息如下：");
                System.out.println(st.toString());
            }else
                System.out.println("输入学号有误！当前学生管理系统没有该学生信息！");
        }
    }

    // 按照学号查找学生信息方法
    public void find(String id){
        // 遍历全部学生，学号一样即找到该学生
        for (Student st : students){
            if (st.getId().equals(id)){
                System.out.println("当前查找到的学生信息如下：");
                System.out.println(st.toString());
            }
            else
                System.out.println("输入学号有误！当前学生管理系统没有该学生信息！");
        }
    }

    // 显示所有学生信息方法
    public void show(){
        System.out.println("-------------所有学生信息如下--------------");
        if (students.size() == 0)
            System.out.println("当前学生信息系统无学生信息！");
        else {
            for (Student s:students) {
                System.out.println(s.toString());
            }
        }
    }

    // 将内存中学生信息保存到文件
    public void save(List<Student> students){
        // 创建文件
        File file = new File("./src/students.txt");
        // 创建向文件写入流
        FileOutputStream fileOutputStream = null;
        ObjectOutputStream objectOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(file);
            // 构建OutputStreamWriter对象,定义编码格式
            objectOutputStream = new ObjectOutputStream(fileOutputStream);
            // 将studens中的内容写入
            objectOutputStream.writeObject(students);

        }catch (IOException e){
            e.printStackTrace();
        }finally {
            // 关闭各种流
            if (objectOutputStream != null){
                try {
                    objectOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileOutputStream != null) {
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    // 将文档中的信息读取到内存中
    public void read(String pathname){
        // 创建文档读取流
        FileInputStream fileInputStream = null;
        ObjectInputStream objectInputStream = null;
        try {
            fileInputStream = new FileInputStream(pathname);
            objectInputStream = new ObjectInputStream(fileInputStream);
            List<Student> students = (ArrayList<Student>) objectInputStream.readObject();
            this.setStudents(students);
        } catch (FileNotFoundException e){
            System.out.println("当问磁盘中没有保存的学生信息文件！请添加并保存！");
        } catch (IOException e){
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            // 关闭流
            if (objectInputStream != null){
                try {
                    objectInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fileInputStream != null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
